radlab-ui/webapp/src/pages/api/deployments/[id]/status.ts (73 lines of code) (raw):

import { getDocsByField, updateBuildStatus, updateByField, } from "@/utils/Api_SeverSideCon" import { getBuildStatus } from "@/utils/api" import { withAuth } from "@/utils/middleware" import { AuthedNextApiHandler, IBuild, IBuildStep, IDeployment, } from "@/utils/types" import { NextApiResponse } from "next" const getDeploymentStatus = async ( _req: AuthedNextApiHandler, res: NextApiResponse, id: string, ) => { // @ts-ignore const [deployment] = (await getDocsByField( "deployments", "deploymentId", id, )) as IDeployment[] if (!deployment || !deployment.builds?.length) { return res.status(400).json({ message: "Not found" }) } const mostRecentBuild = deployment.builds.sort( (a: IBuild, b: IBuild) => b.createdAt._seconds - a.createdAt._seconds, )[0] as IBuild const cloudBuild = await getBuildStatus( mostRecentBuild.buildId, deployment.deploymentId, ) if (!cloudBuild) { return res.status(400).json({ message: "Not found" }) } let tfState = "" cloudBuild.steps.forEach((step: IBuildStep) => { if (step.id === "Apply") { tfState = step.status return } }) const buildSteps = cloudBuild.steps.map((step: IBuildStep) => { return { id: step.id, status: step.status } }) const updateBuilds = { status: cloudBuild.status, buildId: mostRecentBuild.buildId, } await updateBuildStatus(id, updateBuilds) const updateData = { status: cloudBuild.status, } await updateByField("deployments", "deploymentId", id, updateData) res.status(200).json({ buildStatus: cloudBuild.status, tfApplyState: tfState, buildSteps, }) } const handler = async (req: AuthedNextApiHandler, res: NextApiResponse) => { const { id } = req.query if (typeof id !== "string") throw new Error("Deployment ID must be a string") try { if (req.method === "GET") return getDeploymentStatus(req, res, id) } catch (error) { console.error(error) return res.status(500).json({ message: "Internal Server Error" }) } } export default withAuth(handler)